package cronUtil

import (
	"fmt"
	"math/rand"
	"time"
)

// GetEveryMinuteCron 生成每分钟在随机秒数执行的cron表达式
func GetEveryMinuteCron() string {
	rand.Seed(time.Now().UnixNano())
	// 生成0-59之间的随机秒数
	randomSec := rand.Intn(60)
	// 格式: "秒 * * * * ?"表示每分钟的随机秒数执行
	return fmt.Sprintf("%d * * * * ?", randomSec)
}

// GetEveryHourCron 生成每小时在随机分钟和秒数执行的cron表达式
func GetEveryHourCron() string {
	rand.Seed(time.Now().UnixNano())
	// 生成0-59之间的随机分钟
	randomMinute := rand.Intn(60)
	// 生成0-59之间的随机秒数
	randomSec := rand.Intn(60)
	// 格式: "秒 分钟 * * * ?"表示每小时的随机分钟和秒数执行
	return fmt.Sprintf("%d %d * * * ?", randomSec, randomMinute)
}

// GetEveryDayCron 生成每天在随机小时、分钟和秒数执行的cron表达式
func GetEveryDayCron() string {
	rand.Seed(time.Now().UnixNano())
	// 生成0-23之间的随机小时
	randomHour := rand.Intn(24)
	// 生成0-59之间的随机分钟
	randomMinute := rand.Intn(60)
	// 生成0-59之间的随机秒数
	randomSec := rand.Intn(60)
	// 格式: "秒 分 时 * * ?"表示每天的随机时间执行
	return fmt.Sprintf("%d %d %d * * ?", randomSec, randomMinute, randomHour)
}

// GetEveryNDayCron 生成每N天在随机小时、分钟和秒数执行的cron表达式
// n: 天数间隔(1-30)
func GetEveryNDayCron(n int) string {
	rand.Seed(time.Now().UnixNano())
	// 参数验证
	if n > 30 || n < 1 {
		n = 1
	}
	// 生成0-23之间的随机小时
	randomHour := rand.Intn(24)
	// 生成0-59之间的随机分钟
	randomMinute := rand.Intn(60)
	// 生成0-59之间的随机秒数
	randomSec := rand.Intn(60)
	// 格式: "秒 分 时 */间隔 * ?"表示每隔N天的随机时间执行
	return fmt.Sprintf("%d %d %d */%d * ?", randomSec, randomMinute, randomHour, n)
}

// GetEveryMonthCron 生成每月在特定日期的随机小时、分钟和秒数执行的cron表达式
// specificDay: 特定的日期(1-31)
func GetEveryMonthCron(specificDay int) string {
	rand.Seed(time.Now().UnixNano())
	// 参数验证
	if specificDay < 1 || specificDay > 31 {
		specificDay = 1
	}
	// 生成0-23之间的随机小时
	randomHour := rand.Intn(24)
	// 生成0-59之间的随机分钟
	randomMinute := rand.Intn(60)
	// 生成0-59之间的随机秒数
	randomSec := rand.Intn(60)
	// 格式: "秒 分 时 日期 * ?"表示每月特定日期的随机时间执行
	return fmt.Sprintf("%d %d %d %d * ?", randomSec, randomMinute, randomHour, specificDay)
}
